package com.sp.fresh_produce.util;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 订单号生成工厂类
 * 优化后的生成规则：
 * - 格式：年月日(8位) + 时间戳后4位(4位) + 用户ID后3位(3位) + 序列号(3位)
 * - 总长度：18位
 * - 示例：202509201234001099
 */
public class OrderCodeFactory {
    
    private static final AtomicInteger atomicInteger = new AtomicInteger(0);
    private static final Random RANDOM = new Random();
    
    /**
     * 获取日期部分（8位）
     * @return yyyyMMdd格式的日期
     */
    private static String getDatePart(){
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        return now.format(formatter);
    }
    
    /**
     * 获取时间戳部分（4位）
     * 使用当前时间的秒和毫秒生成4位数字
     * @return 4位时间戳
     */
    private static String getTimePart(){
        LocalDateTime now = LocalDateTime.now();
        // 获取时分秒的组合，转换为4位数字
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        // 使用简单算法生成4位数：小时*100 + 分钟，确保唯一性
        int timePart = (hour * 100 + minute) % 10000;
        return String.format("%04d", timePart);
    }

    /**
     * 生成订单号（优化版）
     * @param userId 用户ID
     * @return 18位唯一订单号
     */
    public static String getOrderCode(Long userId){
        // 日期部分：8位
        String datePart = getDatePart();
        
        // 时间部分：4位
        String timePart = getTimePart();
        
        // 用户ID部分：取后3位，不足补0
        String userPart = String.format("%03d", userId != null ? userId % 1000 : 0);
        
        // 序列号部分：3位，确保同一时刻的唯一性
        int sequence = atomicInteger.incrementAndGet();
        if (sequence >= 1000) {
            atomicInteger.set(0);
            sequence = 0;
        }
        String seqPart = String.format("%03d", sequence);
        
        // 组合订单号：日期(8) + 时间(4) + 用户(3) + 序列(3) = 18位
        return datePart + timePart + userPart + seqPart;
    }
    
    /**
     * 生成更短的订单号（极简版）
     * 格式：年份后2位 + 月日(4位) + 时间戳(6位) + 随机数(4位) = 16位
     * @param userId 用户ID
     * @return 16位订单号
     */
    public static String getShortOrderCode(Long userId){
        LocalDateTime now = LocalDateTime.now();
        
        // 年份后2位
        String year = String.format("%02d", now.getYear() % 100);
        
        // 月日：4位
        String monthDay = String.format("%02d%02d", now.getMonthValue(), now.getDayOfMonth());
        
        // 时间戳：6位（时分秒）
        String time = String.format("%02d%02d%02d", 
            now.getHour(), now.getMinute(), now.getSecond());
        
        // 随机数：4位（结合用户ID）
        int random = RANDOM.nextInt(9000) + 1000;
        if (userId != null) {
            random = (random + userId.intValue()) % 10000;
        }
        String randomPart = String.format("%04d", random);
        
        return year + monthDay + time + randomPart;
    }
}